package com.ruoyi.common.utils;

import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.List;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;
import org.springframework.stereotype.Component;

/**
 * 
 * @author:陈斌斌
 * @创建日期: 2022年5月5日 15点52分
 * @ClassName ImportPDF
 * @类描述-Description:导出pdf工具类
 * @版本: 1.0
 */
@Component
public class ExportPDF {

    /**
     * 生成并导出PDF文件
     * @param fileNames  生成pdf的文件名
     * @param title      PDF标题
     * @param list       数据列表
     * @param titleList  表头列表
     * @param request    HttpServletRequest
     * @param response   HttpServletResponse
     * @throws Exception
     */
    public void createPDF(String fileNames, String title, List<?> list,
                          List<String> titleList, HttpServletRequest request,
                          HttpServletResponse response) throws Exception {
        // 设置响应头
        response.setContentType("application/pdf");
        response.addHeader("Content-Disposition",
                "attachment; filename=" + URLEncoder.encode(fileNames, "UTF-8"));
        response.setCharacterEncoding("utf-8");

        // 第一步，实例化Document对象
        Document document = new Document();
        ServletOutputStream out = response.getOutputStream();

        // 第二步，设置中文字体
        BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", false);
        Font titleFont = new Font(bfChinese, 18, Font.BOLD, BaseColor.DARK_GRAY);
        Font headerFont = new Font(bfChinese, 12, Font.BOLD, BaseColor.WHITE);
        Font contentFont = new Font(bfChinese, 10, Font.NORMAL, BaseColor.BLACK);

        // 第三步，获取PdfWriter实例
        PdfWriter writer = PdfWriter.getInstance(document, out);

        // 第四步，打开文档
        document.open();

        // 第五步，添加标题
        Paragraph titleParagraph = new Paragraph(title, titleFont);
        titleParagraph.setAlignment(Element.ALIGN_CENTER);
        titleParagraph.setSpacingAfter(20f);
        document.add(titleParagraph);

        // 第六步，创建表格并设置宽度
        PdfPTable table = new PdfPTable(titleList.size());
        table.setWidthPercentage(100); // 表格宽度100%
        table.setSpacingBefore(10f);
        table.setSpacingAfter(10f);

        // 设置表格列宽 - 根据列数自动调整
        float[] columnWidths = new float[titleList.size()];
        for (int i = 0; i < titleList.size(); i++) {
            columnWidths[i] = 1f; // 平均分配宽度
        }
        table.setWidths(columnWidths);

        // 添加表头
        for (String header : titleList) {
            PdfPCell cell = new PdfPCell(new Phrase(header, headerFont));
            cell.setHorizontalAlignment(Element.ALIGN_CENTER);
            cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
            cell.setBackgroundColor(BaseColor.GRAY);
            cell.setPadding(8f);
            cell.setBorderWidth(1f);
            table.addCell(cell);
        }

        // 添加数据行
        for (Object obj : list) {
            String[] fields = obj.toString().split(","); // 假设数据以逗号分隔
            for (String field : fields) {
                PdfPCell cell = new PdfPCell(new Phrase(field, contentFont));
                cell.setHorizontalAlignment(Element.ALIGN_LEFT);
                cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
                cell.setPadding(5f);
                cell.setBorderWidth(0.5f);
                table.addCell(cell);
            }
        }

        // 添加表格到文档
        document.add(table);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        // 添加生成时间
        Paragraph timeParagraph = new Paragraph(
                "生成时间: " + sdf.format(new java.util.Date()), contentFont);
        timeParagraph.setAlignment(Element.ALIGN_RIGHT);
        timeParagraph.setSpacingBefore(20f);
        document.add(timeParagraph);
        addWatermark(writer, "兰考贵州迎宾酒", new Font(bfChinese, 20, Font.BOLD, new BaseColor(220, 220, 220, 100)));
        // 第七步，关闭文档
        document.close();
    }
    /**
     * 添加水印
     * @param writer PdfWriter对象
     * @param watermarkText 水印文字
     * @param watermarkFont 水印字体
     */
    private void addWatermark(PdfWriter writer, String watermarkText, Font watermarkFont) {
        // 获取PDF内容字节
        PdfContentByte content = writer.getDirectContentUnder();

        // 获取页面尺寸
        Rectangle pageSize = writer.getPageSize();
        float width = pageSize.getWidth();
        float height = pageSize.getHeight();

        // 设置透明度
        PdfGState gs = new PdfGState();
        gs.setFillOpacity(0.2f); // 设置透明度为20%
        content.setGState(gs);

        // 设置水印颜色
        content.setColorFill(watermarkFont.getColor());

        // 添加水印文字 - 在整个页面添加多个水印
        int rows = 5;
        int cols = 3;

        for (int i = 1; i <= rows; i++) {
            for (int j = 1; j <= cols; j++) {
                // 计算水印位置
                float x = (float) (j * width / (cols + 1)); // X坐标
                float y = (float) (i * height / (rows + 1)); // Y坐标

                // 开始文本
                content.beginText();

                // 设置字体和大小
                content.setFontAndSize(watermarkFont.getBaseFont(), watermarkFont.getSize());

                // 设置文本矩阵
                content.setTextMatrix(x, y);

                // 显示文本
                content.showText(watermarkText);

                // 结束文本
                content.endText();
            }
        }

        // 添加倾斜的水印（覆盖整个页面）
        addDiagonalWatermark(content, watermarkText, watermarkFont, width, height);
    }
    /**
     * 添加倾斜的水印（覆盖整个页面）
     * @param content PdfContentByte对象
     * @param watermarkText 水印文字
     * @param watermarkFont 水印字体
     * @param width 页面宽度
     * @param height 页面高度
     */
    private void addDiagonalWatermark(PdfContentByte content, String watermarkText,
                                      Font watermarkFont, float width, float height) {
        // 重置透明度
        PdfGState gs = new PdfGState();
        gs.setFillOpacity(1f); // 设置更低的透明度
        content.setGState(gs);

        // 计算中心位置
        float centerX = width / 2;
        float centerY = height / 2;

        // 开始文本
        content.beginText();

        // 设置字体和大小
        content.setFontAndSize(watermarkFont.getBaseFont(), watermarkFont.getSize());

        // 保存当前状态
        content.saveState();

        // 设置旋转角度（45度）
        content.concatCTM(1, 0, 0, 1, centerX, centerY);
        content.concatCTM(0.7071f, 0.7071f, -0.7071f, 0.7071f, 0, 0);

        // 设置文本位置（居中）
        float textWidth = watermarkFont.getBaseFont().getWidthPoint(watermarkText, watermarkFont.getSize());
        content.setTextMatrix(-textWidth/2, 0);

        // 显示文本
        content.showText(watermarkText);

        // 恢复状态
        content.restoreState();

        // 结束文本
        content.endText();
    }

}
